package org.smile.dataset;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class MapRow extends AbstractRow{

	/**
	 * 行的数据内容 以列表形式保存
	 */
	protected Map<String,Object> map; 
	/**
	 * 构造一个行数据
	 * @param metaData 元素据定义
	 * @param map 行数据内容
	 */
	public MapRow(DataSetMetaData metaData,Map<String,Object> map){
		this.metaData=metaData;
		this.map=map;
	}

	public MapRow(DataSetMetaData metaData,Object[] data){
		this.metaData=metaData;
		this.map=new HashMap<>();
		for(int i=0;i<data.length;i++){
			map.put(metaData.getColumnName(i),data[i]);
		}
	}
	
	@Override
	public Object get(int col) {
		String key=this.metaData.getColumnName(col);
		return map.get(key);
	}

	@Override
	public Object get(String column) {
		return map.get(column);
	}

	@Override
	public  boolean hasColumn(String column){
		return map.containsKey(column);
	}


	@Override
	public Object[] toArray() {
		Object[] objects=new Object[this.metaData.getColumnCount()];
		Set<String> keys=this.metaData.columnNames();
		int i=0;
		for(String key:keys) {
			objects[i++]=map.get(key);
		}
		return objects;
	}


	@Override
	public Object[] values(int[] columns) {
		Object[] result=new Object[columns.length];
		for(int i=0;i<columns.length;i++){
			result[i]=value(columns[i]);
		}
		return result;
	}

	@Override
	public Object value(int column) {
		return map.get(this.metaData.getColumnName(column));
	}

	@Override
	public List<Object> toList() {
		ArrayList objects=new ArrayList(this.metaData.getColumnCount());
		Set<String> keys=this.metaData.columnNames();
		for(String key:keys) {
			objects.add(map.get(key));
		}
		return objects;
	}

	@Override
	public void set(int column, Object value) {
		this.map.put(this.metaData.getColumnName(column), value);
	}

	@Override
	public Object set(String column, Object value) {
		Object v= this.map.put(column, value);
		if(v==null){
			this.metaData.addColumn(column);
		}
		return v;
	}

	/**
	 * 新增加一列
	 * @param column
	 * @param value
	 * @return
	 */
	public Object newColumn(String column,Object value){
		this.metaData.addColumn(column);
		return this.map.put(column,value);
	}


	@Override
	public Row copy() {
		Row row=new MapRow(metaData, new HashMap<>(this.map));
		return row;
	}

}
